package edu.upc.cineplanet.repositoryjdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import edu.upc.cineplanet.Domain.*;
import edu.upc.cineplanet.repository.PeliculaRepository;

/**
 * Loads accounts from a data source using the JDBC API.
 */

@Repository
public class PeliculaRepositoryJdbc extends JdbcDaoSupport implements PeliculaRepository {

	@Autowired
	public PeliculaRepositoryJdbc(DataSource dataSource){
		setDataSource(dataSource);
	}

	public List<Pelicula> obtenerTodasPeliculas() {
		List<Pelicula> peliculas;
		String sql = "SELECT * FROM PELICULA";
		peliculas = getJdbcTemplate().query(sql, new PeliculaRowMapper());
		
		return peliculas;
	}
	
	private class PeliculaRowMapper implements ParameterizedRowMapper<Pelicula>{
		public Pelicula mapRow(ResultSet rs, int rowNum) throws SQLException{
			Pelicula p = new Pelicula();
			p.setCodigoPelicula(rs.getString("co_pelicula"));
			p.setNombrePelicula(rs.getString("no_pelicula"));
			p.setGenero(rs.getString("co_genero"));
			p.setPais(rs.getString("no_pais"));
			p.setDirector(rs.getString("no_director"));
			p.setActores(rs.getString("no_actores")); 
			p.setSitioWeb(rs.getString("no_sitioweb"));
			p.setEstreno(rs.getBoolean("flg_estreno"));
			p.setSinopsis(rs.getString("TXT_SIPNOSIS"));
			p.setRutaTrailer(rs.getString("txt_video"));
			p.setRutaFoto(rs.getString("txt_foto"));
			return p;
		}
	}	
	
	public void ingresarPelicula(Pelicula pelicula) {

		String sql = "INSERT INTO  PELICULA(co_pelicula," +
					 "no_pelicula, " +
					 "co_genero, " +
					 "no_pais, " +
					 "no_director, " +
					 "no_actores, " +
					 "no_sitioweb, " +
					 "flg_estreno," +
					 "TXT_SIPNOSIS," +
					 "txt_video, " +
					 "txt_foto) values (?,?, ?, ?, ?, ?, ?, ? , ?,  ?, ?)";
		getJdbcTemplate().update(sql, pelicula.getCodigoPelicula(), 
				pelicula.getNombrePelicula(), 
				pelicula.getGenero(), 
				pelicula.getPais(),
				pelicula.getDirector(), 
				pelicula.getActores(), 
				pelicula.getSitioWeb(), 
				pelicula.isEstreno(), 
				pelicula.getSinopsis(), 
				pelicula.getRutaTrailer(), 
				pelicula.getRutaFoto());

	}

	public Pelicula buscarPelicula(String nombrePelicula){
		String sql = "select * from pelicula where no_pelicula = ? ";
		Pelicula pelicula;
		try{
			pelicula = getJdbcTemplate().queryForObject(sql, new Object[]{nombrePelicula}, new PeliculaRowMapper());
			
		}catch(EmptyResultDataAccessException ex){
			return null;
		}
		return pelicula;
	}

	
	public List<Pelicula>  buscarPeliculas(String nombrePelicula){
		String sql = "select * from pelicula where no_pelicula like ? ";
		List<Pelicula> peliculas;
		try{
			peliculas = getJdbcTemplate().query(sql, new Object[]{nombrePelicula}, new PeliculaRowMapper());
			
		}catch(EmptyResultDataAccessException ex){
			return null;
		}
		return peliculas;
	}
	
	
	public void eliminarPelicula(Pelicula pelicula) {
		String sql = "delete from pelicula where co_pelicula = ?";
		getJdbcTemplate().update(sql, pelicula.getCodigoPelicula());
	}
	
	public void agregarComentario(PeliculaComentario comentario){
		String sql = "insert into pelicula_comentario( nu_comentario, co_pelicula, fe_registro, txt_comentario, flg_publicar ) values (?, ?, ?, ?, ?)";
		getJdbcTemplate().update(sql, comentario.getCodigoComentario(), comentario.getCodigoPelicula(), comentario.getFecha(), comentario.getComentario(), comentario.isPublicar());

	}
		
	public List<PeliculaComentario> mostrarComentarios() {
		List<PeliculaComentario> comentarios;
		String sql = "select * from pelicula_comentario";
		comentarios = getJdbcTemplate().query(sql, new ComentarioRowMapper());
		return comentarios;
	}
	
	
	public PeliculaComentario buscarComentario(int codigoComentario){
		String sql = "select * from pelicula_comentario where nu_comentario = ?";
		PeliculaComentario comentario;
		try{
			comentario = getJdbcTemplate().queryForObject(sql, new Object[]{codigoComentario}, new ComentarioRowMapper());
			
		}catch(EmptyResultDataAccessException ex){
			return null;
		}
		return comentario;
	}
	
	public void publicarComentario(PeliculaComentario comentario) {
		String sql = "update pelicula_comentario set flg_publicar = true where nu_comentario = ?"; 
		getJdbcTemplate().update(sql, comentario.getCodigoComentario());
		
	}
	

	
	private class ComentarioRowMapper implements ParameterizedRowMapper<PeliculaComentario>{
		public PeliculaComentario mapRow(ResultSet rs, int rowNum) throws SQLException{
			PeliculaComentario c = new PeliculaComentario();
			c.setCodigoComentario(rs.getInt("nu_comentario"));
			c.setCodigoPelicula(rs.getString("co_pelicula"));
			c.setFecha(rs.getString("fe_registro"));
			c.setComentario(rs.getString("txt_comentario"));
			c.setPublicar(rs.getBoolean("flg_publicar"));
			return c;
		}
	}	
	
}